package com.laiqilin.util;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class R {
	private Integer code; // 响应码
	private String message; // 响应消息
	private Map<String, Object> data = new HashMap<>(); // 返回的数据

	/**
	 * 返回成功的响应
	 *
	 * @return 返回成功的响应对象
	 */
	public static R ok() {
		R r = new R();
		r.setCode(ResponseEnum.SUCCESS.getCode()); // 设置成功的响应码
		r.setMessage(ResponseEnum.SUCCESS.getMessage()); // 设置成功的响应消息
		return r;
	}

	/**
	 * 返回失败的响应
	 *
	 * @return 返回失败的响应对象
	 */
	public static R error() {
		R r = new R();
		r.setCode(ResponseEnum.ERROR.getCode()); // 设置失败的响应码
		r.setMessage(ResponseEnum.ERROR.getMessage()); // 设置失败的响应消息
		return r;
	}

	/**
	 * 根据ResponseEnum设置响应结果
	 *
	 * @param responseEnum 响应枚举类型
	 * @return 设置了响应枚举的R对象
	 */
	public static R setResult(ResponseEnum responseEnum) {
		R r = new R();
		r.setCode(responseEnum.getCode()); // 设置响应码
		r.setMessage(responseEnum.getMessage()); // 设置响应消息
		return r;
	}

	/**
	 * 设置响应消息
	 *
	 * @param message 错误信息
	 * @return 当前R对象，支持链式调用
	 */
	public R message(String message) {
		this.setMessage(message); // 设置消息
		return this;
	}

	/**
	 * 设置响应码
	 *
	 * @param code 错误码
	 * @return 当前R对象，支持链式调用
	 */
	public R code(Integer code) {
		this.setCode(code); // 设置响应码
		return this;
	}

	/**
	 * 设置响应数据
	 *
	 * @param key 键
	 * @param value 值
	 * @return 当前R对象，支持链式调用
	 */
	public R data(String key, Object value) {
		this.data.put(key, value); // 添加数据
		return this;
	}

	/**
	 * 设置多个响应数据
	 *
	 * @param map 数据映射
	 * @return 当前R对象，支持链式调用
	 */
	public R data(Map<String, Object> map) {
		this.setData(map); // 设置数据
		return this;
	}
}
